package repo

import (
    "context"
    "device-modbus/internal/biz/model"
    "device-modbus/internal/biz/query"
)

// CommandRepo 指令配置数据访问接口
// 注意：统一设备ID为int64类型（与数据库bigint对应）
type CommandRepo interface {
    // 根据设备ID获取所有指令配置
    ListByDeviceID(ctx context.Context, deviceID string) ([]*model.DeviceCommand, error)

    // 根据设备ID和指令名称获取指令配置
    GetByDeviceAndName(ctx context.Context, deviceID string, name string) (*model.DeviceCommand, error)

    // 创建新指令配置
    Create(ctx context.Context, cmd *model.DeviceCommand) error

    // 批量创建指令配置
    BatchCreate(ctx context.Context, cmds []*model.DeviceCommand) error

    // 更新指令配置
    Update(ctx context.Context, cmd *model.DeviceCommand) error

    // 删除指令配置
    Delete(ctx context.Context, deviceID string, name string) error

    // 批量删除设备的所有指令配置
    DeleteByDeviceID(ctx context.Context, deviceID string) error
}

// commandRepo 基于 GORM Gen 的指令配置数据访问实现
type commandRepo struct {
    q *query.Query // GORM Gen 生成的查询器
}

// NewCommandRepo 创建指令配置数据访问实例
func NewCommandRepo(q *query.Query) CommandRepo {
    return &commandRepo{q: q}
}

// 根据设备ID获取所有指令配置
func (r *commandRepo) ListByDeviceID(ctx context.Context, deviceID string) ([]*model.DeviceCommand, error) {
    return r.q.DeviceCommand.
        WithContext(ctx).
        Where(query.DeviceCommand.DeviceID.Eq(deviceID)).
        Order(query.DeviceCommand.Sort.Asc()). // 按Sort字段升序排序
        Find() // 将结果指针传入Find方法
}

// 根据设备ID和指令名称获取指令配置
func (r *commandRepo) GetByDeviceAndName(ctx context.Context, deviceID, name string) (*model.DeviceCommand, error) {
    return r.q.DeviceCommand.
        WithContext(ctx).
        Where(query.DeviceCommand.DeviceID.Eq(deviceID)).
        Where(query.DeviceCommand.Name.Eq(name)).
        First()
}

// 创建新指令配置
func (r *commandRepo) Create(ctx context.Context, cmd *model.DeviceCommand) error {
    return r.q.DeviceCommand.
        WithContext(ctx).
        Create(cmd)
}

// 批量创建指令配置
func (r *commandRepo) BatchCreate(ctx context.Context, cmds []*model.DeviceCommand) error {
    if len(cmds) == 0 {
        return nil // 空列表无需处理，避免无效数据库操作
    }
    // 批量大小限制（避免单次SQL过大）
    batchSize := 1000
    for i := 0; i < len(cmds); i += batchSize {
        end := i + batchSize
        if end > len(cmds) {
            end = len(cmds)
        }
        if err := r.q.DeviceCommand.
            WithContext(ctx).
            CreateInBatches(cmds[i:end], end-i); err != nil {
            return err
        }
    }
    return nil
}

// 更新指令配置 - 修复：添加错误返回
func (r *commandRepo) Update(ctx context.Context, cmd *model.DeviceCommand) error {
    _, err := r.q.DeviceCommand.
        WithContext(ctx).
        Where(query.DeviceCommand.DeviceID.Eq(cmd.DeviceID)).
        Where(query.DeviceCommand.Name.Eq(cmd.Name)).
        Updates(cmd) // 使用Updates而非Update，支持批量字段更新
    return err
}

// 删除指令配置 - 修复：错误处理
func (r *commandRepo) Delete(ctx context.Context, deviceID, name string) error {
    _, err := r.q.DeviceCommand.
        WithContext(ctx).
        Where(query.DeviceCommand.DeviceID.Eq(deviceID)).
        Where(query.DeviceCommand.Name.Eq(name)).
        Delete()
    return err
}

// 批量删除设备的所有指令配置 - 修复：错误处理
func (r *commandRepo) DeleteByDeviceID(ctx context.Context, deviceID string) error {
    _, err := r.q.DeviceCommand.
        WithContext(ctx).
        Where(query.DeviceCommand.DeviceID.Eq(deviceID)).
        Delete()
    return err
}
